// map flat reduce  isArray
Array.prototype.myMap = function (callback, ...args) {
    let newArr = [];
    for (let i = 0; i < this.length; i++) {
        // 这里的callback也是有(当前项，索引，this)
        newArr[i] = callback.call(args, this[i], i, this);
    }
    return newArr;
}

Array.prototype.myFlat = function (count = 1) {
    let newArr = [];
    let num = count;
    if (num <= 0) { return this }
    for (let i = 0; i < this.length; i++) {
        if (Array.isArray(this[i])) {
            newArr = newArr.concat(this[i].myFlat(--num))  // f返回值需要插入外层
        } else {
            newArr.push(this[i])
        }
    }
    return newArr

    // if (Array.isArray(this)) {
    //     let arr = [];
    //     if (!Number(num) || Number(num) < 0) {
    //         return this
    //     }
    //     this.forEach((item) => {
    //         if (Array.isArray(this)) {
    //             let count = num;
    //             arr = arr.concat(item.myFlat(count--))
    //         } else {
    //             arr.push(item)
    //         }
    //     })
    //     return arr
    // } else {
    //     throw "this .flat is not function"
    // }
}

console.log([1, 2, [1, [1, [2,1]]]].myFlat(2))

// 他有两个参数 callback 与 initValue
Array.prototype.myReduce = function (callback, initValue) {
    let res = initValue ? initValue : this[0];
    for (let i = 0; i < this.length; i++) {
        let _this = this
        // 回调有四个参数(上次值，下一个，索引，this)
        res = callback(res, this[i + 1], i, _this)
    }
    return res;
}

Array.prototype.isArray = function () {
    return Object.prototype.toString().call(this) === "[Object Array]"
}